package com.mengtian_tech.tju.dataquery.api.db;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;

import java.util.List;
import java.util.Map;
import java.util.function.Function;

import javax.sql.DataSource;

public class EnhancedJdbcTemplate extends JdbcTemplate {
	
	public EnhancedJdbcTemplate (DataSource ds) {
		super(ds);
	}

    /**
     * 查询并返回自定义对象（使用RowMapper）
     */
    public <T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args) {
        List<T> results = super.query(sql, rowMapper, args);
        return DataAccessUtils.singleResult(results);
    }

    /**
     * 查询并返回自定义对象（使用BeanPropertyRowMapper）
     */
    public <T> T queryForObject(String sql, Class<T> clazz, Object... args) {
        return queryForObject(sql, new BeanPropertyRowMapper<>(clazz), args);
    }

    /**
     * 查询并返回自定义对象（使用ResultSetExtractor）
     */
    public <T> T queryForObject(String sql, ResultSetExtractor<T> rse, Object... args) {
        return super.query(sql, args, rse);
    }

    /**
     * 查询并返回自定义对象（使用Function转换）
     */
    public <T> T queryForObject(String sql, Function<Map<String, Object>, T> mapper, Object... args) {
        Map<String, Object> map = super.queryForMap(sql, args);
        return mapper.apply(map);
    }

    /**
     * 查询并返回自定义对象列表（使用RowMapper）
     */
    public <T> List<T> queryForList(String sql, RowMapper<T> rowMapper, Object... args) {
        return super.query(sql, rowMapper, args);
    }

    /**
     * 查询并返回自定义对象列表（使用BeanPropertyRowMapper）
     */
    public <T> List<T> queryForList(String sql, Class<T> clazz, Object... args) {
    	
    	if(clazz == String.class) {
    		return super.queryForList(sql, clazz, args);
    	}
    	
        return queryForList(sql, new BeanPropertyRowMapper<>(clazz), args);
    }
}